package com._21cn.framework.flip;

import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.io.UnsupportedEncodingException;

/**
 * 翻页信息
 */
public class PageTurn implements Serializable {

	private static final long serialVersionUID = -3078109584161867959L;

	private Integer firstPage = 0; // 首页数

	private Integer pageCount = 0; // 页数

	private Integer page = 0;// 当前页

	private Integer nextPage = 0;// 下一页

	private Integer prevPage = 0;// 上一页

	private Integer start = 0;// 当前页开始条

	private Integer end = 0;// 当前页结束条

	private Integer pageSize = 0;// 每页显示的条数

	private Integer rowCount = 0;// 记录数

	/**
	 * 空的构造函数
	 */
	public PageTurn() {

	}

	/**
	 * 构造函数，初始化
	 *
	 * @param page     当前页编号，从1开始编号
	 * @param pagesize 每页显示的条数
	 */
	public PageTurn(int page, int pagesize) {
		initWithPage(page, pagesize, (page > 0 ? page : 1) * pagesize);
	}

	/**
	 * 构造函数，初始化
	 *
	 * @param page      当前页编号，从1开始编号
	 * @param pagesize  每页显示的条数
	 * @param rowscount 总的记录条数
	 */
	public PageTurn(int page, int pagesize, int rowscount) {
		initWithPage(page, pagesize, rowscount);
	}

	/**
	 * 初始化
	 *
	 * @param page      当前页编号，从1开始编号
	 * @param pagesize  每页显示的条数
	 * @param rowscount 总的记录条数
	 */
	public void initWithPage(int page, int pagesize, int rowscount) {
		initWithStart((page - 1) * pagesize, pagesize, rowscount);
	}

	/**
	 * 初始化
	 *
	 * @param startRow  开始记录数
	 * @param pagesize  每页显示的条数
	 * @param rowscount 总的记录条数
	 */
	public void initWithStart(int startRow, int pagesize, int rowscount) {
		if (rowscount <= 0 || pagesize <= 0) {
			return;
		}

		this.firstPage = 1;
		this.rowCount = rowscount;
		this.pageSize = pagesize;

		int startResult = startRow < 0 ? 0 : startRow;
		this.start = startResult;
		if (startResult > rowscount) {
			this.start = 0;
			this.pageSize = 0;
			this.rowCount = 0;
		}

		this.pageCount = (int) Math.ceil((double) rowscount / pagesize);

		int pageResult = startResult / pagesize + 1;
		if (pageResult > pageCount.intValue())
			pageResult = pageCount.intValue();
		this.page = pageResult;

		int nextpageResult = pageResult + 1;
		nextpageResult = nextpageResult >= pageCount.intValue() ? pageCount.intValue() : nextpageResult;
		this.nextPage = nextpageResult;

		int endResult = startResult + pagesize;
		endResult = endResult > rowscount ? rowscount : endResult;
		this.end = endResult;

		this.prevPage = pageResult > 1 ? (pageResult - 1) : 1;
	}

	/**
	 * @return 第一页编号
	 */
	public Integer getFirstPage() {
		return firstPage;
	}

	public void setFirstPage(Integer firstPage) {
		this.firstPage = firstPage;
	}

	/**
	 * @return 本页结束记录编号
	 */
	public Integer getEnd() {
		return end;
	}

	public void setEnd(Integer end) {
		this.end = end;
	}

	/**
	 * @return 当前页编号
	 */
	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	/**
	 * @return 当前页编号
	 */
	public Integer getCurrentPage() {
		return page;
	}

	/**
	 * @return 下页编号
	 */
	public Integer getNextPage() {
		return nextPage;
	}

	public void setNextPage(Integer nextPage) {
		this.nextPage = nextPage;
	}

	/**
	 * @return 总页数
	 */
	public Integer getPageCount() {
		return pageCount;
	}

	public void setPageCount(Integer pageCount) {
		this.pageCount = pageCount;
	}

	/**
	 * @return 每页显示的记录条数
	 */
	public Integer getPageSize() {
		return pageSize;
	}

	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * @return 上页编号
	 */
	public Integer getPrevPage() {
		return prevPage;
	}

	public void setPrevPage(Integer prevPage) {
		this.prevPage = prevPage;
	}

	/**
	 * @return 总记录数
	 */
	public Integer getRowCount() {
		return rowCount;
	}

	public void setRowCount(Integer rowCount) {
		this.rowCount = rowCount;
	}

	/**
	 * @return 本页开始记录编号
	 */
	public Integer getStart() {
		return start;
	}

	public void setStart(Integer start) {
		this.start = start;
	}

	public String toString() {
		StringBuffer sb = new StringBuffer("{start:").append(start).append(",end:").append(end)
				.append(",prevPage:").append(prevPage).append(",page:").append(page).append(",nextPage:")
				.append(nextPage).append(",pageSize:").append(pageSize).append(",pageCount:").append(pageCount)
				.append(",rowCount:").append(rowCount).append("}");
		return sb.toString();
	}

	private String goPage(String pageUrl, int pageNo) {
		return pageUrl.replace("{pageNo}", String.valueOf(pageNo));
	}

	/**
	 * 输出显示分页导航信息
	 *
	 * @param pageUrl     翻页的url，可包含参数占位符{pageNo}
	 * @param delta       翻多页的具体数量，如下5页，上5页
	 * @param arrowString 上页下页的显示箭头，额可以是文字或图片的
	 * @param selectPager 是否可以直接选取某个页面范围
	 * @param iso88591    是否输出iso88591编码
	 * @return html代码片段
	 */
	public String toPageString(String pageUrl, int delta, String[] arrowString, boolean selectPager,
							   boolean iso88591) throws UnsupportedEncodingException {
		StringBuilder result = new StringBuilder();

		if (delta < 1 || delta > 10) {
			delta = 10;
		}
		if (StringUtils.isEmpty(pageUrl)) {
			pageUrl = "javascript:gopage({pageNo});";
		}

		//String[] img = { "《","<",">","》" };
		String[] img = {"上" + delta + "页", "上页", "下页", "下" + delta + "页", "转到"};
		if (arrowString != null && arrowString.length == 5) {
			img = arrowString;
		}

		int num = page.intValue() % delta;
		int nextDelta = page.intValue() + 1 + (num == 0 ? 0 : (delta - num));

		if (page.intValue() > delta && !StringUtils.isEmpty(img[0])) {
			result.append("<a href='").append(goPage(pageUrl, page.intValue() - delta)).append("' title=\"前")
					.append(delta).append("页\" class='deltapage'>").append(img[0]).append("</a> ");
		}
		if (page.intValue() > 1 && !StringUtils.isEmpty(img[1])) {
			result.append("<a href='").append(goPage(pageUrl, page.intValue() - 1))
					.append("' title=\"上一页\" class='nextpage'>").append(img[1]).append("</a> ");
		}

		for (int i = Math.max(nextDelta - delta, 1); i <= pageCount.intValue() && i < nextDelta; i++) {
			if (i == page.intValue()) {
				result.append("<a href='").append(goPage(pageUrl, i)).append("' title=\"第").append(i)
						.append("页\" class='cpage'><b>").append(i).append("</b></a>");
			} else {
				result.append("<a href='").append(goPage(pageUrl, i)).append("' title=\"第").append(i)
						.append("页\" class='page'>").append(i).append("</a>");
			}
		}

		if (page.intValue() < pageCount.intValue() && !StringUtils.isEmpty(img[2])) {
			result.append("<a href='").append(goPage(pageUrl, page.intValue() + 1))
					.append("' title=\"下一页\" class='nextpage'>").append(img[2]).append("</a> ");
		}
		if (nextDelta < pageCount.intValue() && !StringUtils.isEmpty(img[3])) {
			result.append("<a href='").append(goPage(pageUrl, nextDelta)).append("' title=\"后").append(delta)
					.append("页\" class='deltapage'>").append(img[3]).append("</a> ");
		}

		if (selectPager && !StringUtils.isEmpty(img[4])) {
			result.append("<span onclick='javascript:gopage(this.nextSibling.value)' class=gopage>")
					.append(img[4]).append("</span><select name=pgs size=1 onChange='")
					.append("gopage(this.options[this.selectedIndex].value)' class=select>");
			for (int i = 1; i <= pageCount.intValue(); i += delta) {
				result.append("<option value=").append(i).append(((page.intValue() >= i &&
						page.intValue() < (i + delta)) ? "selected" : "")).append(">").append(i).append("-")
						.append(Math.min(i + delta, pageCount.intValue())).append("</option>");
			}
			result.append("</select>页");
		} else if (!StringUtils.isEmpty(img[4])) {
			result.append("<span onclick='javascript:gopage(this.nextSibling.value)' class=gopage>")
					.append(img[4]).append("</span><input name=pgi type=text size=3 value=\"")
					.append(page.intValue()).append("\" class=textinput>页");
		}
		if (iso88591) {
			return new String(result.toString().getBytes("GBK"), "ISO-8859-1");
		}
		return result.toString();
	}

	/**
	 * 输出显示分页导航信息
	 *
	 * @param pageUrl     翻页的url，可包含参数占位符{pageNo}
	 * @param delta       翻多页的具体数量，如下5页，上5页
	 * @param arrowString 上页下页的显示箭头，额可以是文字或图片的
	 * @param selectPager 是否可以直接选取某个页面范围
	 * @return html代码片段（iso88591编码）
	 */
	public String toPageString(String pageUrl, int delta, String[] arrowString, boolean selectPager) throws UnsupportedEncodingException {
		return toPageString(pageUrl, delta, arrowString, selectPager, true);
	}

	public String toPageStringUTF8(String pageUrl, int delta, String[] arrowString, boolean selectPager) throws UnsupportedEncodingException {
		return toPageString(pageUrl, delta, arrowString, selectPager, false);
	}

	/**
	 * 输出显示分页导航信息
	 *
	 * @param delta       翻多页的具体数量，如下5页，上5页
	 * @param arrowString 上页下页的显示箭头，额可以是文字或图片的
	 * @param selectPager 是否可以直接选取某个页面范围
	 * @return html代码片段（iso88591编码）
	 */
	@Deprecated
	public String toPageString(int delta, String[] arrowString, boolean selectPager) throws UnsupportedEncodingException {
		return toPageString(null, delta, arrowString, selectPager);
	}

	public String toPageStringUTF8(int delta, String[] arrowString, boolean selectPager) throws UnsupportedEncodingException {
		return toPageString(null, delta, arrowString, selectPager, false);
	}

/*	public static void main( String args[] ){
        PageTurn turn =new PageTurn();
		turn.initWithPage( 0, 11, 120 );
		System.out.println( turn );
	}
*/

}
